/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package org.cip.esymons.general.bc;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Vector;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import org.cip.esymons.colegiatura.bc.ColegiadoFacadeLocal;
import org.cip.esymons.colegiatura.be.Colegiado;
import org.cip.esymons.general.be.TipoUsuario;
import org.cip.esymons.general.be.UsuarioExterno;
import org.cip.esymons.general.util.Utiles;

/**
 *
 * @author ADMINISTRADOR
 */
@Stateless
public class UsuarioExternoFacade implements UsuarioExternoFacadeLocal {

    @EJB
    ColegiadoFacadeLocal delegadoColegiado;

    @PersistenceContext(unitName = "org.cip.esymons-ejbPU")
    private EntityManager em;

    public void create(UsuarioExterno usuarioExterno) {
        em.persist(usuarioExterno);
    }

    public void edit(UsuarioExterno usuarioExterno) {
        em.merge(usuarioExterno);
    }

    public void remove(UsuarioExterno usuarioExterno) {
        em.remove(em.merge(usuarioExterno));
    }

    public UsuarioExterno find(Object id) {
        return em.find(UsuarioExterno.class, id);
    }

    public TipoUsuario buscaTipo(Integer codigo){

        try {
            return (TipoUsuario)em.createQuery("select object(o) from TipoUsuario as o where o.tusCodigo = ?1").
                    setParameter(1, codigo).getSingleResult();
        } catch (Exception e) {

            return null;
        }
    }


    public List<UsuarioExterno> listaUsuarios(){

        Vector v = new Vector();
        List<UsuarioExterno> lista = new ArrayList<UsuarioExterno>();

        try {
            v = (Vector) em.createNativeQuery("call sp_listarUsuariosExternos;").getResultList();
            for (int i = 0; i < v.size(); i++) {
                UsuarioExterno user = new UsuarioExterno();

                user.setGueCodigo(Utiles.aEntero(((Vector) v.elementAt(i)).get(0).toString())); //System.out.println("ok1");

                String usuario = ( (((Vector) v.elementAt(i)).get(1)) != null ) ? (((Vector) v.elementAt(i)).get(1)).toString() : ""; //System.out.println("ok2");
                user.setGueUsuario(usuario);

                String clave = ( (((Vector) v.elementAt(i)).get(2)) != null ) ? (((Vector) v.elementAt(i)).get(2)).toString() : ""; //System.out.println("ok3");
                user.setGueClave(clave);

                user.setGueFecha(((Date) ((Vector) v.elementAt(i)).get(3))); //System.out.println("ok4");

                TipoUsuario tipoUsuario = new TipoUsuario();
                Integer tipo = Utiles.aEntero(((Vector) v.elementAt(i)).get(4).toString()); //System.out.println("ok5");
                tipoUsuario = buscaTipo(tipo);
                //System.out.println("tipo : "+tipoUsuario.getTusNombre());
                user.setTusCodigo(tipoUsuario);

                String pregunta = ( (((Vector) v.elementAt(i)).get(5)) != null ) ? (((Vector) v.elementAt(i)).get(5)).toString() : ""; //System.out.println("ok6");
                user.setGuePregunta(pregunta);

                String respuesta = ( (((Vector) v.elementAt(i)).get(6)) != null ) ? (((Vector) v.elementAt(i)).get(6)).toString() : ""; //System.out.println("ok7");
                user.setGueRespuesta(respuesta);

                user.setGueActivo(((Boolean) (((Vector) (v.elementAt(i))).get(7))).booleanValue()); //System.out.println("ok8");

                if(tipoUsuario.getTusNombre().compareToIgnoreCase("colegiado")==0){
                  String nombreCompleto = "";
                  Colegiado colegiado = new Colegiado();
                  colegiado = delegadoColegiado.buscaColegiadoPorCIP(usuario);
                  nombreCompleto = colegiado.getPersonaNatural().getNombreCompleto();
                  //System.out.println("nombre : "+nombreCompleto);
                  user.setNombreCompleto(nombreCompleto);

               }
                lista.add(user);
               // System.out.println("ok paso");
                user = null;
            }
            return null;
        }catch(Exception ex){
            return null;
        }

    }

    public List<UsuarioExterno> listaUsuariosPorTipo(TipoUsuario tipo) {

        List<UsuarioExterno> listaUsuarioExterno;
        Colegiado colegiado;
        try{
           listaUsuarioExterno = em.createQuery("select object(o) from UsuarioExterno as o where o.tusCodigo = ?1").setParameter(1, tipo).getResultList();

           for(UsuarioExterno user : listaUsuarioExterno){
               if(user.getTusCodigo().getTusNombre().compareToIgnoreCase("colegiado")==0){
                  colegiado = new Colegiado();
                  colegiado = delegadoColegiado.buscarColegiadoXDni(user.getGueClave());
                  user.setNombreCompleto(colegiado.getPersonaNatural().getNombreCompleto());
               }
           }
        }catch(Exception ex){
            return null;
        }
        return listaUsuarioExterno;
    }
    public List<UsuarioExterno> findAll() {

        List<UsuarioExterno> listaUsuarioExterno;
//        Colegiado colegiado;
        try{
           listaUsuarioExterno = em.createQuery("select object(o) from UsuarioExterno as o").getResultList();
                  
//           for(UsuarioExterno user : listaUsuarioExterno){
//               if(user.getTusCodigo().getTusNombre().compareToIgnoreCase("colegiado")==0){
//                  colegiado = new Colegiado();
//                  colegiado = delegadoColegiado.buscarColegiadoXDni(user.getGueClave());
//                  user.setColegiado(colegiado);
//               }
//           }
        }catch(Exception ex){
            return null;
        }
        return listaUsuarioExterno;
    }

    public UsuarioExterno validarUsuario(String user, String clave) {


        UsuarioExterno userExterno;
        userExterno = new UsuarioExterno();
        try{
        userExterno = (UsuarioExterno) em.createQuery("select object(o) from UsuarioExterno as o " +
                "where o.gueUsuario = ?1 and o.gueClave = ?2 and o.gueActivo = true")
                .setParameter(1, user)
                .setParameter(2, clave).getSingleResult();        
        }catch(Exception ex){
            return userExterno = new UsuarioExterno();
        }
        return userExterno;

    }

    public List<UsuarioExterno> findRange(int[] range) {
        Query q = em.createQuery("select object(o) from UsuarioExterno as o");
        q.setMaxResults(range[1] - range[0]);
        q.setFirstResult(range[0]);
        return q.getResultList();
    }

    public int count() {
        return ((Long) em.createQuery("select count(o) from UsuarioExterno as o").getSingleResult()).intValue();
    }

}
